package com.tao.config.Mq;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class TopicConfig {
    //队列 起名：TesttopicQueue
    @Bean
    public Queue miaoShaQueue() {
        // durable:是否持久化,默认是false,持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在，暂存队列：当前连接有效
        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。
        //   return new Queue("TesttopicQueue",true,true,false);
        //一般设置一下队列的持久化就好,其余两个就是默认false
        return new Queue("miaoshaSyt.topic", true, false,false);
    }

//    /*
//     * 普通预约队列*/
//    @Bean
//    public Queue submitTableQueue() {
//        // durable:是否持久化,默认是false,持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在，暂存队列：当前连接有效
//        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable
//        // autoDelete:是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。
//        //   return new Queue("TesttopicQueue",true,true,false);
//        //一般设置一下队列的持久化就好,其余两个就是默认false
//        return new Queue("qa.submit.qa", true, false,false);
//    }

    //topic交换机 起名：TesttopicExchange
    @Bean
    public TopicExchange topicOrderExchange() {
        //  return new topicExchange("TesttopicExchange",true,true);
        return new TopicExchange("miaoshaSyt", true, false);
    }

//    //普通ing队列。，需要通过死信队列
//    @Bean
//    public TopicExchange topicSubmitTableExchange() {
//        //  return new topicExchange("TesttopicExchange",true,true);
//        return new TopicExchange("submitTable", true, false);
//    }



    //绑定  将队列和交换机绑定, 并设置用于匹配键：TesttopicRouting
    @Bean
    public Binding bindingtopic1() {
        return BindingBuilder.bind(miaoShaQueue()).to(topicOrderExchange()).with("#.miaoshaSyt.#");
    }

    //绑定  将队列和交换机绑定, 并设置用于匹配键：topicSubmitExchange
//    @Bean
//    public Binding bindingtopic2() {
////        return BindingBuilder.bind(miaoShaQueue()).to(topicSubmitTableExchange()).with("#.submit.#");
////        return BindingBuilder.bind(submitTableQueue()).to(topicSubmitTableExchange()).with("#.submit.#");
//        return new Binding("miaoshaSyt", Binding.DestinationType.QUEUE,
//                "ORDER_DL_EXCHANGE", "#.submit.#", null);
//
//    }



//    ********************************************************************************

    /**
     * 订单死信队列交换机标识符  属性值不能改，写死
     */
    private static final String ORDER_DEAD_LETTER_QUEUE_KEY = "x-dead-letter-exchange";
    /**
     * 订单死信队列交换机绑定键 标识符  属性值不能改，写死
     */
    private static final String ORDER_DEAD_LETTER_ROUTING_KEY = "x-dead-letter-routing-key";

    //----------------------------订单死信定义------------------------------
    // 订单过期流程： 消息（创建的订单号）---》发送到订单死信队列，不消费（设置过期时间）---》（超过设定的过期时间）根据ORDER_DEAD_LETTER_QUEUE_KEY路由死信交换机 ---》重新消费，根据ORDER_DEAD_LETTER_ROUTING_KEY转发到转发队列（取出消息订单号查找订单，假如仍然未支付就取消订单）---》end

    /**
     * orderDeadLetterExchange（direct类型交换机）
     */
    @Bean("orderDeadLetterExchange")
    public Exchange orderDeadLetterExchange() {
        return ExchangeBuilder.directExchange("ORDER_DL_EXCHANGE").durable(true).build();
//        return ExchangeBuilder.topicExchange("ORDER_DL_EXCHANGE").durable(true).build();
    }


    /**
     * 声明一个订单死信队列.
     * x-dead-letter-exchange   对应  死信交换机
     * x-dead-letter-routing-key  对应 死信队列
     */
    @Bean("orderDeadLetterQueue")
    public Queue orderDeadLetterQueue() {
        // 参数
        Map<String, Object> args = new HashMap<>(2);
        // 出现dead letter之后将dead letter重新发送到指定exchange
        args.put(ORDER_DEAD_LETTER_QUEUE_KEY, "ORDER_DL_EXCHANGE");
//        args.put(ORDER_DEAD_LETTER_QUEUE_KEY, "submitTable");
        // 出现dead letter之后将dead letter重新按照指定的routing-key发送
        args.put(ORDER_DEAD_LETTER_ROUTING_KEY, "SUBMIT_KEY");
//        args.put(ORDER_DEAD_LETTER_ROUTING_KEY, "RED_KEY");
        // name队列名字  durable是否持久化，true保证消息的不丢失, exclusive是否排他队列，如果一个队列被声明为排他队列，该队列仅对首次申明它的连接可见，并在连接断开时自动删除, autoDelete如果该队列没有任何订阅的消费者的话，该队列是否会被自动删除, arguments参数map
        return new Queue("ORDER_DL_QUEUE",true,false,false, args);
    }

    /**
     * 定义订单死信队列转发队列.
     */
    @Bean("orderRedirectQueue")
    public Queue orderRedirectQueue() {
        return new Queue("ORDER_REDIRECT_QUEUE",true,false,false);
    }


    @Bean
    public Queue orderSubmitQueue() {
        return new Queue("Submit_Queue",true,false,false);
    }

    /**
     * 死信路由通过 DL_KEY 绑定键绑定到订单死信队列上.
     * 就是第一次发送 消息
     */
    @Bean
    public Binding orderDeadLetterBinding() {
        return new Binding("ORDER_DL_QUEUE", Binding.DestinationType.QUEUE, "ORDER_DL_EXCHANGE", "DL_KEY", null);
    }



    /**
     * 死信路由通过 KEY_R 绑定键绑定到订单转发队列上.
     */
//    @Bean
//    public Binding orderRedirectBinding() {
//        return new Binding("ORDER_REDIRECT_QUEUE", Binding.DestinationType.QUEUE, "ORDER_DL_EXCHANGE", "RED_KEY", null);
//    }

    @Bean
    public Binding submitRedirectBinding() {
        return new Binding("Submit_Queue", Binding.DestinationType.QUEUE, "ORDER_DL_EXCHANGE", "SUBMIT_KEY", null);
    }


}
